package config

import (
	"fmt"
	"github.com/spf13/viper"
	"path/filepath"
	"runtime"
)

var (
	// Global 全局配置
	Global *Config
	v      *viper.Viper
	// 配置变更回调函数map
	callbacks = make(map[string]ConfigChangeCallback)
)

type Config struct {
	Server     ServerConfig     `yaml:"server"`
	DMDatabase DMDatabaseConfig `yaml:"dmDatabase"` // 新增达梦数据库配置

	Jwt             JwtConfig `yaml:"jwt"`
	DefaultPassword string    `yaml:"defaultPassword"`

	NebulaConfig NebulaConfig `yaml:"nebula"`
}

type NebulaConfig struct {
	Host           []string `yaml:"host"`
	Port           int      `yaml:"port"`
	User           string   `yaml:"user"`
	Password       string   `yaml:"password"`
	MaxConnections int      `yaml:"maxConnections"`
	IdleTimeout    int      `yaml:"idleTimeout"`
	SpaceName      string   `yaml:"spaceName"`
}
type JwtConfig struct {
	Secret string `yaml:"secret"`
	Expire int64  `yaml:"expire"`
}
type ServerConfig struct {
	Port int    `yaml:"port"`
	Mode string `yaml:"mode"`
}
type ConfigChangeCallback func(key string, value interface{})

type DMDatabaseConfig struct {
	DSN string `yaml:"dsn"`
}

func InitConfig() error {
	v = viper.New()
	v.SetConfigType("yaml")

	// 获取当前文件的绝对路径
	_, currentFile, _, ok := runtime.Caller(0)
	if !ok {
		return fmt.Errorf("获取当前文件路径失败")
	}
	// 获取配置文件的目录
	configDir := filepath.Join(filepath.Dir(currentFile))

	// 设置配置文件路径
	v.AddConfigPath(configDir)

	// 加载基础配置
	v.SetConfigName("config")
	if err := v.ReadInConfig(); err != nil {
		return fmt.Errorf("读取基础配置失败: %w", err)
	}
	envConfigFile := filepath.Join(configDir, "config.yaml")
	v.SetConfigFile(envConfigFile)
	if err := v.MergeInConfig(); err != nil {
		return fmt.Errorf("读取环境配置失败: %w", err)
	}

	// 解析配置到结构体
	Global = &Config{}
	if err := v.Unmarshal(Global); err != nil {
		return fmt.Errorf("解析配置失败: %w", err)
	}

	return nil
}
